Software programs known a “debugging tools” are widely used by software developers. The purpose of a debugging tool is to allow a software developer to examine for errors a software program that is under development. Functions such as “Step Into”, “Step Over”, “Step Out” and “Run to Cursor” allow the user to effectively “freeze” execution of the program under examination at a given program instruction, to allow checking of variable values, memory contents, etc., and to gain insight into the workings of the program under examination.
Some programs support multi-threaded operation, either by original design or as a result of being partitioned into threads upon compiling. Multi-threaded operation can result in significant efficiencies, but conventional debugging tools do not readily allow for tracing of synchronization signals or of data passed across thread boundaries.